package com.moshang.exportsql.util;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;

/**
 */
public class NancalStringUtils {
    private NancalStringUtils() {
    }
    public static final String DIALOG_CRE = "DDtoCre";
    public static final String DIALOG_CRE_R = "DDtoCreR";
    public static final String DIALOG_GET = "DDtoGetI";
    public static final String DIALOG_UPD = "DDtoUpd";
    public static final String DIALOG_SAVE = "DDtoSave";
    public static final String DIALOG_QRY = "DDtoQry";

    public static final String DIALOG_MODEL_CRE = "D_%s_Cre";
    public static final String DIALOG_MODEL_CRE_R = "D_%s_CreR";
    public static final String DIALOG_MODEL_GET = "D_%s_GetI";
    public static final String DIALOG_MODEL_UPD = "D_%s_Upd";
    public static final String DIALOG_MODEL_SAVE = "D_%s_Save";

    public static final String DIALOG_MODEL_QRY = "D_%s_Qry";
    /**
     * 替换特殊符号
     *
     * @param str str
     * @return {@link String}
     */
    public static String replaceSpecialSymbols(String str) {
        if (StrUtil.isBlank(str)) {
            return "";
        }
        return str
            .replaceAll("'", "''")
            .replaceAll("\\\\", "\\\\\\\\")
            .replaceAll("\"", "\\\\\"")
            .replaceAll("\n", "\\\\n")
            .replaceAll("\r", "\\\\r");
    }

    /**
     * 驼峰转下划线
     * Examples AAABbb-->aaa_bbb ClassName-->class_name
     * <p>
     * 参考了org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy的实现
     * <p>
     *     查看更多 <a href="https://github.com/hibernate/hibernate-orm/blob/main/hibernate-core/src/main/java/org/hibernate/boot/model/naming/CamelCaseToUnderscoresNamingStrategy.java">here</a>.
     *
     * @param str
     * @return {@link String}
     */
    public static String dumpToUnderline(String str) {
        if (StrUtil.isBlank(str)) {
            return "";
        }
        StringBuilder builder = new StringBuilder(str.replace('.', '_'));
        for (int i = 1; i < builder.length() - 1; ++i) {
            if (isUnderscoreRequired(builder.charAt(i - 1), builder.charAt(i), builder.charAt(i + 1))) {
                builder.insert(i++, '_');
            }
        }
        return builder.toString().toLowerCase();
    }

    private static boolean isUnderscoreRequired(char before, char current, char after) {
        return (Character.isLowerCase(before) && Character.isUpperCase(current) && Character.isLowerCase(after))||(Character.isDigit(before)&&Character.isUpperCase(current));
    }


    /**
     * 比较两个字符串，同时特殊处理了 null 和空字符串 ("") 的情况。
     * <p>
     * 该方法的比较规则如下：
     * <ul>
     * <li>如果两个字符串都为 null，则被视为相等。</li>
     * <li>如果一个字符串为 null，另一个为空字符串 ("")，则被视为相等。</li>
     * <li>如果两个字符串都不为 null，并且它们通过标准的 {@code StringUtils.equals} 方法比较相等，则被视为相等。</li>
     * </ul>
     *
     * @param str1 第一个要比较的字符串（可为 null）。
     * @param str2 第二个要比较的字符串（可为 null）。
     * @return {@code true} 如果两个字符串被视为相等；{@code false} 否则。
     * @see StrUtil#equals(CharSequence, CharSequence)
     */
    public static boolean equalsIgnoreNullAndEmpty(String str1, String str2) {
        if (StrUtil.isEmpty(str1) && StrUtil.isEmpty(str2)) {
            return true;
        }
        return StrUtil.equals(str1, str2);
    }


    public static String dDtoToDialog(String code, String dialog) {
        switch (dialog) {
            case DIALOG_CRE_R:
                return dDtoCreRToDialog(code);
            case DIALOG_CRE:
                return dDtoCreToDialog(code);
            case DIALOG_UPD:
                return dDtoUpdToDialog(code);
            case DIALOG_GET:
                return dDtoGetIToDialog(code);
            case DIALOG_SAVE:
                return dDtoSaveToDialog(code);
            case DIALOG_QRY:
                return dDtoQryToDialog(code);
            default:
                return "";
        }
    }

    public static boolean isValidVariableName(String variableName) {
        // 检查变量名是否为空
        if (variableName == null || variableName.trim().isEmpty()) {
            return false;
        }

        // 检查变量名是否符合 Java 标识符规范
        for (int i = 0; i < variableName.length(); i++) {
            char c = variableName.charAt(i);
            if (i == 0 && !Character.isJavaIdentifierStart(c)) {
                return false; // 第一个字符必须是 Java 标识符的有效起始字符
            }
            if (i > 0 && !Character.isJavaIdentifierPart(c)) {
                return false; // 其他字符必须是 Java 标识符的有效字符
            }
        }

        // 变量名符合 Java 命名规则
        return true;
    }

    private static String dDtoCreRToDialog(String code) {
        return String.format(DIALOG_MODEL_CRE_R, code);
    }

    private static String dDtoCreToDialog(String code) {
        return String.format(DIALOG_MODEL_CRE, code);
    }
    public static String dDtoCreToDialog(String code,String dialog) {
        return String.format(dialog, code);
    }
    private static String dDtoUpdToDialog(String code) {
        return String.format(DIALOG_MODEL_UPD, code);
    }

    private static String dDtoGetIToDialog(String code) {
        return String.format(DIALOG_MODEL_GET, code);
    }

    private static String dDtoSaveToDialog(String code) {
        return String.format(DIALOG_MODEL_SAVE, code);
    }
    private static String dDtoQryToDialog(String code) {
        return String.format(DIALOG_MODEL_QRY, code);
    }

    public static String dDtoToDialogAction(String dialog) {
        switch (dialog) {
            case DIALOG_CRE_R:
                return DIALOG_MODEL_CRE_R;
            case DIALOG_CRE:
                return DIALOG_MODEL_CRE;
            case DIALOG_UPD:
                return DIALOG_MODEL_UPD;
            case DIALOG_GET:
                return DIALOG_MODEL_GET;
            case DIALOG_SAVE:
                return DIALOG_MODEL_SAVE;
            case DIALOG_QRY:
                return DIALOG_MODEL_QRY;
            default:
                return "";
        }
    }
    /**
     * 第一个字母改为小写
     *
     * @param str 斯特
     * @return {@link String}
     */
    public static String firstLetterToLowerCase(String str) {
        if (ObjectUtil.isNull(str)) {
            return str;
        }
        String retStr = str.substring(0, 1);
        return retStr.toLowerCase() + str.substring(1, str.length());
    }

    /**
     * 补全小数点后的零
     *
     * @param number 需要处理的数字，以 String 形式表示
     * @param zeros 需要补全的零的数量
     * @return 如果 number 是一个像 "2." 或 "2" 这样的数字，返回补全小数点后的零后的结果；如果 number 是一个像 "2.34" 这样的数字，返回原值
     */
    public static String completeDecimal(String number, int zeros) {
        StringBuilder zeroBuilder = new StringBuilder();
        for (int i = 0; i < zeros; i++) {
            zeroBuilder.append("0");
        }

        String zeroString = zeroBuilder.toString();

        if (number.contains(".")) {
            // 如果 number 包含小数点，但小数点后没有数字，补全指定数量的零
            if (number.endsWith(".")) {
                return number + zeroString;
            }
            // 如果 number 包含小数点，并且小数点后有数字，不进行任何处理
            else {
                return number;
            }
        } else {
            // 如果 number 不包含小数点，添加 ".0"
            return number + "." + zeroString;
        }
    }
}
